package org.seedltd.upms.service.detection;

import org.seedltd.core.base.BasePage;
import org.seedltd.core.base.IBaseService;
import org.seedltd.upms.model.detection.entity.DetectionOrder;
import org.seedltd.upms.model.detection.form.*;
import org.seedltd.upms.model.detection.vo.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 订单管理业务接口
 * 
 * @author laizuan
 * @since 2021/07/31
 * @version 1.0
 */
public interface DetectionOrderService extends IBaseService<DetectionOrder> {

    /**
     * 通过主键获取数据
     *
     * @param id
     *            主键
     * @return 数据
     */
    DetectionOrder getById(Long id);

    /**
     * 通过订单号获取订单
     * 
     * @param tradeNo
     *            订单号
     * @return
     */
    DetectionOrder getByOrderNo(String tradeNo);

    /**
     * 获取到可以出货的订单
     * 
     * @param id
     *            订单主键
     * @param isBg
     *            是否后台管理发起出货
     * @return
     */
    DetectionOrder getNotifyExportOrder(Long id, boolean isBg);

    /**
     * 获取订单报告
     * 
     * @param orderId
     *            订单主键
     * @return
     */
    DetectionTubeVO getReportOrder(Long orderId);

    /**
     * 检测账户下是否有未绑定的订单
     * 
     * @return true 有，false没有
     */
    boolean checkUnBanding();

    /**
     * 修改商品和订单中间表状态
     *
     * @param orderId
     *            订单主键
     * @param productId
     *            产品主键
     * @param state
     *            订单检测项目的检测结果
     * @param checkResult
     *            检测项结果
     */
    boolean updateOrderProduct(Long orderId, Long productId, String state, String checkResult);

    /**
     * 通过设备主键获取订单
     * 
     * @param tubeId
     *            设备主键
     * @return
     */
    DetectionOrder getByTubeId(Long tubeId);

    /**
     * 更新支付状态
     * 
     * @param query
     *            支付回调数据
     * @return
     */
    boolean updatePayStatus(QueryVO query, Long orderId) throws Exception;

    /**
     * 获取到订单的检测项目列表
     * 
     * @param orderId
     *            订单主键
     * @return
     */
    List<DetectionOrderProductVO> listProductByOrderId(Long orderId);

    /**
     * 通过主键获取数据
     *
     * @param id
     *            主键
     * @return 数据
     */
    DetectionOrderVO findById(Long id);

    /**
     * 新增数据
     *
     * @param form
     *            表单数据
     * @return 主键
     */
    Long add(DetectionOrderForm form, HttpServletRequest request) throws Exception;

    /**
     * 列表查询
     * 
     * @param searchForm
     *            搜索条件
     * @return 列表数据
     */
    BasePage<DetectionOrderVO> page(DetectionOrderSearchForm searchForm);

    /**
     * 用户列表查询
     *
     * @param form
     *            查询条件
     * @param type
     *            1表示样本订单，0表示报告列表，2，待投递
     * @return 列表数据
     */
    List<DetectionOrderVO> page(MiniOrderSearchForm form, Integer type);

    /**
     * 获取待投递的订单
     *
     * @return
     */
    List<DetectionOrderVO> listOrderDeliver();

    /**
     * 绑定信息
     *
     * @param form
     *            绑定数据
     * @return
     */
    boolean binding(DetectionOrderBindingForm form);

    /**
     * 检查二维码是否被绑定
     * 
     * @param orderId
     *            订单主键
     * @param qrcode
     *            二维码编号
     * @return true已绑定
     */
    String checkBinding(Long orderId, String qrcode);

    /**
     * 绑定信息
     *
     * @param codeNo
     *            投递箱二维码编号
     * @param orderId
     *            订单主键
     * @return
     */
    boolean deliver(Long orderId, String codeNo);

    /**
     * 退款
     * 
     * @param refundForm
     *            退款对象
     * @return
     */
    boolean refund(DetectionOrderRefundForm refundForm);

    /**
     * 检测人员获取绑定信息
     * 
     * @param codeNo
     *            二维码编号
     * @return
     */
    DetectionOrderBindingSampleVO getBindingInfo(String codeNo);

    /**
     * 通知贩卖机出货
     * 
     * @param orderId
     *            订单主键
     * @param isBg 是否后台操作
     * @return
     */
    boolean exportGoods(Long orderId, boolean isBg);

    /**
     * 小程序用户删除订单
     * 
     * @param orderId
     *            订单号
     * @return
     */
    boolean deleteByOrderId(Long orderId);
}